//
// Copyright (C) 2005 Vojtech Janota
//
// SPDX-License-Identifier: LGPL-3.0-or-later
//

package inet.networklayer.rsvpte;

import inet.common.SimpleModule;

//
// Implements RSVP-TE, a signalling protocol for MPLS. The module processes RSVP-TE messages, installs labels and does the reservation along LSP paths.
//
// Paths can be specified statically in an XML config file ("traffic" parameter), or can be set up and torn down dynamically with ~ScenarioManager commands.
//
// An example traffic.xml file:
//
//# FIXME: Verify against the code, and document formally (DTD)!
//# <setup_pri>, <holding_pri>, <sender>, <owner>, <max_delay> elements
//# are implemented but missing from this doc!
//
// <pre>
// <?xml version="1.0"?>
// <sessions>
//     <session>
//         <endpoint>host3</endpoint>
//         <tunnel_id>1</tunnel_id>
//         <paths>
//             <path>
//                 <lspid>100</lspid>
//                 <bandwidth>100000</bandwidth>
//                 <route>
//                     <node>10.1.1.1</node>
//                     <lnode>10.1.2.1</lnode>
//                     <node>10.1.4.1</node>
//                     <node>10.1.5.1</node>
//                 </route>
//                 <permanent>true</permanent>
//                 <color>100</color>
//             </path>
//         </paths>
//     </session>
// </sessions>
// </pre>
//
// In the route, <node> stands for a strict hop, and <lnode> stands for a loose hop.
//
// ~RsvpTe understands the "add-session" and "del-session" ~ScenarioManager commands. The contents of the <add-session> element can be the same as the <session> element for the traffic.xml above.
// The <del-command> element syntax is also similar, but only <endpoint>, <tunnel_id> and <lspid> need to be specified.
//
// The following is an example scenario.xml file:
//
// <pre>
// <?xml version="1.0"?>
// <scenario>
//     <at t="2">
//         <add-session module="LSR1.rsvp">
//             <endpoint>10.2.1.1</endpoint>
//             <tunnel_id>1</tunnel_id>
//             <paths>
//                 ...
//             </paths>
//         </add-session>
//     </at>
//     <at t="2.4">
//         <del-session module="LSR1.rsvp">
//             <endpoint>10.2.1.1</endpoint>
//             <tunnel_id>1</tunnel_id>
//             <paths>
//                 <path>
//                     <lspid>100</lspid>
//                 </path>
//             </paths>
//         </del-session>
//     </at>
// </scenario>
// </pre>
//
// RSVP-TE messages are subclassed from ~RsvpMessage and include ~RsvpPathMsg, ~RsvpPathTear, ~RsvpPathError, ~RsvpResvMsg, and ~RsvpHelloMsg.
//
// RSVP-TE communicates with the following components in the system: ~Ted, ~Mpls, and may receive commands from ~ScenarioManager.
//

simple RsvpTe extends SimpleModule
{
    parameters:
        @class(RsvpTe);
        string interfaceTableModule;   // The path to the InterfaceTable module
        string routingTableModule;
        string libTableModule;
        string tedModule;
        string classifierModule; // The path to the module which implements the IIngressClassifier C++ interface
        xml traffic = default(xml("<sessions/>")); // Specifies paths to set up
        string peers; // Names of the interfaces towards RSVP peers
        double helloInterval @unit(s);
        double helloTimeout @unit(s);
        @display("i=block/control");
        @signal[tedChanged](type=inet::TedChangeInfo);
    gates:
        input ipIn @labels(Ipv4ControlInfo/up);
        output ipOut @labels(Ipv4ControlInfo/down);
        input mplsSwitchIn;
        input appIn;
}

